home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / conhlp03 / padp_src / oprate2.c < prev    next >
C/C++ Source or Header  |  1995-02-19  |  2KB  |  117 lines

  1. /*
  2.     oprate2.c
  3.     入力でストップしない ( = inkey() )
  4.     getch -> getop
  5.     使用前に padinit() で初期化すること
  6.     ストップしないので kbhit,getch の置き換えにならない
  7.     参考文献
  8.     FM TOWNSテクニカルデータブック アスキー出版
  9.     趣味のパソコン 10倍楽しむ教養講座  平林 雅英  技術評論社
  10.     1994/03/02 1994/11/21
  11. */
  12.  
  13. #include <dos.h>
  14. #include <time.h>
  15. #include "oprate2.h"
  16.  
  17. /* パッド1入力レジスタ 04d0 */
  18. /* パッド2入力レジスタ 04d2 */
  19. /* -.COM.TRG2.TRG1.RIGHT_B.LEFT_B.BACK.FWD */
  20.  
  21. /* パッド出力レジスタ 04d6 */
  22. /* 0.0.JOY2COM.JOY1COM.JOY2TRIG2.JOY2TRIG1.JOY1TRIG2.JOY1TRIG1 */
  23.  
  24. #define TRG2 (32)
  25. #define TRG1 (16)
  26. #define RIGHT_B (8)
  27. #define LEFT_B  (4)
  28. #define BACK  (2)
  29. #define FWD   (1)
  30. #define PADINP1 (0x04d0)
  31. #define PADINP2 (0x04d2)
  32. #define PADCTRL (0x04d6)
  33.  
  34. #define NULL (0)
  35.  
  36.  
  37. /* 1/10sec wait */
  38.  
  39. #define TIME time((long *)0) /* 現在時刻取得マクロ */
  40.  
  41. void wait( long t ){
  42.  
  43.     /* 初めての呼び出しまたは、t<0 で初期化 */
  44.     static int base = 0;
  45.     long wtime;
  46.  
  47.     if( t < 0 ) base = 0;
  48.     if( base == 0 ){
  49.         /* 初期化 */
  50.         wtime = TIME;
  51.         while(wtime == TIME);
  52.         wtime++;
  53.         while(wtime == TIME) base++;
  54.     }else{
  55.         /* 時間待ち */
  56.         wtime =  t * base / 100 ;
  57.         while( wtime-- > 0 ) TIME;
  58.     }
  59.  
  60. }
  61.  
  62.  
  63. unsigned char kbios( void ){
  64.     union REGS in,out;
  65.     /* バッファクリア */
  66.     in.h.ah = 0x06;
  67.     in.h.al = 0;
  68.     int86(0x90,&in,&out);
  69.     /* 1/10 sec wait */
  70.     wait( 10 );
  71.     /* 入力チェック */
  72.     in.h.ah = 0x07;
  73.     int86(0x90,&in,&out);
  74.     if(out.h.ah!=0) return NULL;
  75.     if(out.h.dh==0xff) return NULL;
  76.     return out.h.dl;
  77. }
  78.  
  79. unsigned char padst( void ){
  80.     char ps;
  81.     ps = (~inp( PADINP1 )) & 0x3f ;
  82.     switch ( ps ) {
  83.     case TRG2:
  84.         return QUIT ;
  85.     case TRG1:
  86.         return EXEC ;
  87.     case FWD + BACK:        /* sellect ESCキー */
  88.         return ESCKEY ;
  89.     case LEFT_B + RIGHT_B:        /* run 実行キー */
  90.         return EXEC ;
  91.     /* 4方向の処理 */
  92.     case FWD:
  93.         return UP  ;
  94.     case RIGHT_B:
  95.         return RIGHT  ;
  96.     case BACK:
  97.         return DOWN  ;
  98.     case LEFT_B:
  99.         return LEFT  ;
  100.     default:
  101.     /* 斜めは無視 */
  102.         break;
  103.     }
  104.     return NULL;
  105. }
  106.  
  107.  
  108. unsigned char inkey( void ){
  109.     char r;
  110.     if(( r = kbios() ) != NULL ) return r;
  111.     return ( padst() );
  112. }
  113.  
  114. void padinit( void ){
  115.     outp( PADCTRL, 0x0f );
  116. }
  117.